RestTemplate介绍
RestTemplate是Spring提供的用于访问Rest服务的客户端,同时RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
RestTemplate初探
通过实例展示RestTemplate的使用
| 1 | 
 | 
示例参数:
- String url: 该方法第一个参数标识请求的url
- ClassresponseType: 该参数标识该次HTTP请求的结果映射成的对象类型, 
- Object… urlVariables: 该参数用来为url中的参数赋值,支持多个值传递.
RestTemplate的交互说明
上面示例中的交互可以分为三个步骤:
- url和参数聚合
- HTTP请求交互
- HTTP结果映射
对应的SpringRest中的如下方法.
| 1 | 
 | 
URL和参数聚合
RestTemplate的源码中使用getUriTemplateHandler().expand(url, urlVariables)来完善完成URL中占位符参数的聚合。
示例:
| 1 | 
 | 
RestTemplate中HTTP交互过程
http交互规范的定义
了解该块前先看看Spring中对ClientHttpRequest和对应的工厂接口的定义
ClientHttpRequest接口的定义
ClientHttpRequest接口的定义很简单,一个钩子方法
| 1 | public interface ClientHttpRequest extends HttpRequest, HttpOutputMessage { | 
ClientHttpRequest接口默认提供了如下的扩展类

ClientHttpRequestFactory接口的定义
ClientHttpRequestFactory接口的定义如下:
| 1 | public interface ClientHttpRequestFactory { | 
ClientHttpRequestFactory接口提供的实现类如下:

HttpAccessor的代理实现
Spring中定义了抽象类HttpAccessor, 提供了默认的ClientHttpRequestFactory实现,
ClientHttpRequestFactory默认值为SimpleClientHttpRequestFactory().
对应的HttpAccessor实现的代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public abstract class HttpAccessor {
   protected final Log logger = LogFactory.getLog(getClass());
   private ClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
   public void setRequestFactory(ClientHttpRequestFactory requestFactory) {
       Assert.notNull(requestFactory, "'requestFactory' must not be null");
       this.requestFactory = requestFactory;
   }
   public ClientHttpRequestFactory getRequestFactory() {
       return this.requestFactory;
   }
   protected ClientHttpRequest createRequest(URI url, HttpMethod method) throws IOException {
       ClientHttpRequest request = getRequestFactory().createRequest(url, method);
       if (logger.isDebugEnabled()) {
           logger.debug("Created " + method.name() + " request for \"" + url + "\"");
       }
       return request;
   }
}
doExecute中的钩子使用
URL构建完成后RestTemplate调用的是一个doExecute方法,该方法对应的代码如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28protected <T> T doExecute(URI url, HttpMethod method, RequestCallback requestCallback,	ResponseExtractor<T> responseExtractor) throws RestClientException {
   Assert.notNull(url, "'url' must not be null");
   Assert.notNull(method, "'method' must not be null");
   ClientHttpResponse response = null;
   try {
       ClientHttpRequest request = createRequest(url, method);
       if (requestCallback != null) {
           requestCallback.doWithRequest(request);
       }
       response = request.execute();
       handleResponse(url, method, response);
       if (responseExtractor != null) {
           return responseExtractor.extractData(response);
       }
       else {
           return null;
       }
   }
   catch (IOException ex) {
       throw new ResourceAccessException("I/O error on " + method.name() +
               " request for \"" + url + "\": " + ex.getMessage(), ex);
   }
   finally {
       if (response != null) {
           response.close();
       }
   }
}
这里的createRequest(url, method)方法集成自抽象类HttpAccessor.这样,在构建完成后,HTTP交互过程交给定义的ClientHttpRequest的规范实现.
HTTP交互结果处理
HTTP交互接口返回通过ResponseExtractor<T>该规范来处理.
ResponseExtractor1
2
3public interface ResponseExtractor<T> {
	T extractData(ClientHttpResponse response) throws IOException;
}
ResponseExtractor

示例中我们的接口调用的返回结果实现使用的是ResponseEntityResponseExtractor<T>
| 1 | 
 | 
具体的实现可以参看RestTemplate,不再做过多介绍.
RestTemplate类关系图
RestTemplate类关系图

这里RestTemplate使用的常见的Rest请求的接口都定义在RestOperations中,对应的规范定义如下:
GET 规范
| 1 | 
 | 
HEAD 规范
| 1 | // HEAD | 
POST 规范
| 1 | // POST | 
PUT 规范
| 1 | // PUT | 
DELETE 规范
| 1 | // DELETE | 
OPTIONS 规范
| 1 | // OPTIONS | 
在提供通用REST(GET、POST、HEAD、PUT、DELETE、OPTIONS)规范操作的基础上还提供了exchange()和execute()相关的规范操作接口定义.
RestTemplate异步模块
AsyncRestTemplate是提供的异步操作RestTemplate的组件快.使用方式比较简单.
| 1 | 
 |